442. Find All Duplicates in an Array
442. Find All Duplicates in an Array
Similar Question
Solution Tips
这种方法又名原地哈希,哈希的本质就是做标记。
Arithmetic-progression
方案一:正负标记
var findDuplicates = function(nums) {
const dup = [];
// 等差数列,原地标记
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
// 等差数列的第几项
const itemIndex = Math.abs(num) - 1;
if (nums[itemIndex] > 0) {
nums[itemIndex] = -nums[itemIndex];
}
else {
// dup
dup.push(Math.abs(num));
}
}
return dup;
};
console.log(findDuplicates([10,2,5,10,9,1,1,4,3,7]))
console.log(findDuplicates([4,3,2,7,8,2,3,1]))
console.log(findDuplicates([1,1, 2]))
console.log(findDuplicates([1]))
方案二:交换元素
本质上是方案一变换了标记的形式,通过 itemIndex 是否在正确的位置来标记
var findDuplicates = function(nums) {
const swap = (nums, index1, index2) => {
const temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
};
const n = nums.length;
for (let i = 0; i < n; ++i) {
while (nums[i] != nums[nums[i] - 1]) {
swap(nums, i, nums[i] - 1);
}
}
const ans = [];
for (let i = 0; i < n; ++i) {
if (nums[i] - 1 !== i) {
ans.push(nums[i]);
}
}
return ans;
}